#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>

using namespace std;

int pp[4005];
int par(int a)
{
	if(pp[a] == a)
		return a;
	return pp[a] = par(pp[a]);
}

bool join(int a, int b)
{
	a = pp[a];
	b = pp[b];
	if(a == b)
		return false;
	if(rand() % 2)
		pp[a] = b;
	else
		pp[b] = a;
	return true;
}

int e[200005][2];
bool eu[200005];

vector<vector<int> > init;
vector<vector<int> > g;
int ps[2005];
int sz = 0;
int m;

int btm[4005];
bool u[4005];
int dp[4005];
int st[4005][2];
int su[4005];

void color(int v)
{
	while(sz > 0 && dp[su[sz-1]] >= dp[v])
	{
		sz--;
		int id = dp[su[sz]];
		eu[st[id][1]] = 1;
	}
}

int func(int v, int d)
{
	if(v < st[0][0])
		return -1;
	if(dp[v] != -1)
	{
		if(u[btm[v]])
			color(btm[v]);
		if(u[v])
			color(v);
		return btm[v];
	}

	//btm[v] = v;
	u[v] = 1;
	dp[v] = d;
	st[d][0] = v;

	for(int i = 0; i < g[v].size(); i++)
	{
		int to = g[v][i];
		if(!eu[to])
		{
			st[d][1] = to;
			su[sz++] = v;
			int tmp = func(e[to][1], d+1);
			if(tmp != -1 && dp[tmp] < dp[btm[v]])
				btm[v] = tmp;
			if(su[sz-1] == v)
				sz--;
		}
	}

	u[v] = 0;
	return btm[v];
}

vector<vector<int> > res;

int main()
{
	int n;
	scanf("%d", &n);
	init.resize(n);

	for(int i = 0; i < n; i++)
	{
		int m;
		scanf("%d", &m);
		init[i].resize(m);
		for(int j = 0; j < m; j++)
			scanf("%d", &init[i][j]);
	}

	for(int i = 0; i < n; i++)
		scanf("%d", &ps[i]);

	g.resize(2*n);
	for(int i = 0; i < n; i++)
	{
		ps[i]--;
		for(int j = 0; j < init[i].size(); j++)
		{
			int to = init[i][j] - 1;
			if(to == ps[i])
			{
				g[i].push_back(sz);
				e[sz][0] = i;
				e[sz][1] = to + n;
				sz++;
			}
			else
			{
				g[to+n].push_back(sz);
				e[sz][0] = to + n;
				e[sz][1] = i;
				sz++;
			}
		}
	}

	m = sz;

	for(int i = 0; i < n; i++)
	{
		if(!u[i])
		{
			memset(dp, -1, sizeof(dp));
			for(int i = 0; i < 2*n; i++)
				btm[i] = i;
			sz = 0;
			func(i, 0);
		}
	}

	res.resize(n);
	for(int i = 0; i < m; i++)
	{
		if(eu[i])
		{
			if(e[i][0] >= n)
				res[e[i][1]].push_back(e[i][0] - n);
		}
	}

	for(int i = 0; i < n; i++)
	{
		res[i].push_back(ps[i]);
		sort(res[i].begin(), res[i].end());
		printf("%d ", res[i].size());
		for(int j = 0; j < res[i].size(); j++)
			printf("%d ", res[i][j] + 1);
		printf("\n");
	}
	
	return 0;
}

/*
5
3 1 2 5
3 1 2 3
3 1 3 4
3 3 4 5
3 1 4 5
1 2 3 4 5 

3
3 1 2 3
2 2 3
1 3
1 2 3

4
2 1 2
2 1 2
2 2 3
2 3 4
1 2 3 4

3
2 1 2
3 1 2 3
2 2 3
1 2 3

4
2 1 2
2 2 3
3 3 1 4 
2 4 3
1 2 3

4
3 1 2 4
2 1 2
3 2 3 4
2 3 4
1 2 3 4
*/